home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Ham⁄GPS / SoftKiss.src.1.8 Folder / SoftKiss.src.1.8 / core / sfk_core_pbuf.c < prev    next >
Text File  |  1993-03-12  |  4KB  |  159 lines

  1. /*
  2.  * add/remove packets to a queue
  3.  * by Aaron Wohl / N3LIW (aw0g+@andrew.cmu.edu) jul 1990
  4.  * 6393 Penn Ave #303
  5.  * Pittsburgh PA, 15206
  6.  * work: (412)-268-5032
  7.  * home: (412)-731-6159
  8.  */
  9.  
  10. #include "sfk_core.h"
  11. #include "sfk_core_private.h"
  12.  
  13. struct data_header_R {
  14.     uint16 pnum;        /*home port*/
  15.     uint16 ref_cnt;        /*number of sharers*/
  16. };
  17. typedef struct data_header_R data_header,*data_header_pt;
  18.  
  19.  
  20. /*
  21.  * free a packet header and packet
  22.  * may be called with interupts on
  23.  */
  24. void sfk_free_packet_protected(sfk_prt_pt p,sfk_packet_pt free_me)
  25. {
  26.     sfk_SCC_interupts_off;
  27.     sfk_free_packet(p,free_me);
  28.     sfk_SCC_interupts_on;
  29. }
  30.  
  31. /*
  32.  * free a packet header and packet
  33.  */
  34. void sfk_free_packet(sfk_prt_pt p,sfk_packet_pt free_me)
  35. {
  36.     data_header_pt dh= (data_header_pt)(free_me->data-sizeof(data_header));
  37.     sfk_enqueue(&p->sfk_freehq,free_me);
  38.     dh->ref_cnt--;
  39.     if(dh->ref_cnt > 0)
  40.  {        SFK_ASSERT(FALSE,SFK_TEXT(63));
  41.         return;    /*data is still being shared*/
  42. }
  43.     if((dh->pnum<0)||(dh->pnum>=sfk_NUM_PORTS))
  44.         SFK_ASSERT(FALSE,SFK_TEXT(63));
  45.     p=sfk_PN(dh->pnum);                /*data goes back to home port*/
  46.     sfk_enqueue(&p->sfk_freedq,(sfk_packet_pt)dh);
  47. }
  48.  
  49. /*
  50.  * copy a packet header and share a packet
  51.  */
  52. sfk_packet_pt sfk_copy_packet(sfk_prt_pt p,sfk_packet_pt copy_me)
  53. {
  54.     data_header_pt dh= (data_header_pt)(copy_me->data-sizeof(data_header));
  55.     register sfk_packet_pt result=sfk_dequeue(&p->sfk_freehq);
  56.     if(result==0)
  57.         return 0;
  58.     *result=*copy_me;
  59.     dh->ref_cnt++;
  60.     dh++;
  61.     result->data=(uint8*)dh;
  62.     return result;
  63. }
  64.  
  65. /*
  66.  * allocate a packet header and packet
  67.  * may be called with interupts on
  68.  */
  69. sfk_packet_pt sfk_allocate_protected(sfk_prt_pt p)
  70. {
  71.     register sfk_packet_pt result;
  72.     sfk_SCC_interupts_off;
  73.     result=sfk_allocate_packet(p);
  74.     sfk_SCC_interupts_on;
  75.     return result;
  76. }
  77.  
  78. /*
  79.  * allocate a packet header and packet
  80.  */
  81. sfk_packet_pt sfk_allocate_packet(sfk_prt_pt p)
  82. {
  83.     register sfk_packet_pt result;
  84.     register data_header_pt data_result;
  85.     if((p->sfk_freehq.sfk_size==0)||
  86.        (p->sfk_freedq.sfk_size==0))
  87.            return 0;
  88.     result=sfk_dequeue(&p->sfk_freehq);
  89.     data_result= (data_header_pt)sfk_dequeue(&p->sfk_freedq);
  90.     data_result->pnum=p->pnum;
  91.     data_result->ref_cnt=1;        /*one header shareing this data*/
  92.     data_result++;                /*skip to start of real data*/
  93.     result->data= (uint8*)data_result;
  94.     return result;
  95. }
  96.  
  97. /*
  98.  * remove a packet from the passed queue and return it
  99.  * returns nil if the queue was empty
  100.  */
  101. sfk_packet_pt sfk_dequeue_protected(sfk_queue_pt aq)
  102. {
  103.     register sfk_packet_pt result;
  104.     sfk_SCC_interupts_off;
  105.     result=sfk_dequeue(aq);
  106.     sfk_SCC_interupts_on;
  107.     return result;
  108. }
  109.  
  110. /*
  111.  * remove a packet from the passed queue and return it
  112.  * returns nil if the queue was empty
  113.  */
  114. void sfk_enqueue_protected(sfk_queue_pt aq,sfk_packet_pt ap)
  115. {
  116.     sfk_SCC_interupts_off;
  117.     sfk_enqueue(aq,ap);
  118.     sfk_SCC_interupts_on;
  119. }
  120.  
  121. /*
  122.  * remove a packet from the passed queue and return it
  123.  * returns nil if the queue was empty
  124.  */
  125. sfk_packet_pt sfk_dequeue(sfk_queue_pt aq)
  126. {
  127.     register sfk_packet_pt result;
  128.     if(aq->sfk_size==0)
  129.         return 0;
  130.     result=aq->sfk_first;
  131.     aq->sfk_first=result->next;
  132.     aq->sfk_size--;
  133.     if(aq->sfk_size<=0)
  134.         aq->sfk_last=0;
  135.     return result;
  136. }
  137.  
  138. /*
  139.  * initialize the passed queue to be empty
  140.  */
  141. void sfk_init_queue(sfk_queue_pt aq)
  142. {
  143.     memset(aq,0,sizeof(*aq));
  144. }
  145.  
  146. /*
  147.  * enqueue the passed packet in the passed queue
  148.  */
  149. void sfk_enqueue(sfk_queue_pt aq,sfk_packet_pt ap)
  150. {
  151.     ap->next=0;
  152.     if(aq->sfk_size==0)
  153.         aq->sfk_first=ap;
  154.     else
  155.         aq->sfk_last->next=ap;
  156.     aq->sfk_last=ap;
  157.     aq->sfk_size++;
  158. }
  159.